from typing import Optional

from sqlalchemy import Column, BIGINT
from sqlmodel import Field, SQLModel

from src.base.beans import Datetime, Bigint

"""
@hybrid_property ： 混合属性，定义一个既能在 Python 中访问，也能在 SQL 查询中使用的属性(需要@xxx.expression配合)
@hybrid_method ：混合方法，定义一个既能在 Python 中调用，也能在查询中使用的方法(需要@xxx.expression配合)
@hybrid_property.expression ： 定义 SQL 表达式

@field_serializer ： 字段序列化
@field_validator ： 字段验证，@field_validator 必须在 @classmethod 之上
"""


class DbBaseModel(SQLModel):
    """
    基础模型类，作为所有数据模型的父类
    包含了通用的字段和方法，如创建时间、更新时间等
    """
    __abstract__ = True  # 告诉框架这是一个抽象类，不映射为表

    class Config:
        use_enum_values = True  # 自动将枚举转换为对应值
        extra = "ignore"  # 不允许额外字段

    sort: Optional[int] = Field(default=None, description="排序字段",
                                sa_column_kwargs={"comment": "排序字段", "server_default": "0"})
    status: Optional[int] = Field(default=None, description="状态", sa_column_kwargs={"comment": "状态"})
    remark: Optional[str] = Field(default=None, description="备注", sa_column_kwargs={"comment": "备注"})
    del_flag: Optional[bool] = Field(default=None, description="删除标志,0=未删除；1=删除",
                                     sa_column_kwargs={"comment": "删除标志,0=未删除；1=删除",
                                                       "server_default": "0"})
    creator: Optional[str] = Field(default=None, description="创建者", sa_column_kwargs={"comment": "创建者"})
    updater: Optional[str] = Field(default=None, description="更新者", sa_column_kwargs={"comment": "更新者"})
    create_time: Optional[Datetime] = Field(default=None, description="创建时间",
                                            sa_column_kwargs={"comment": "创建时间"}, )
    update_time: Optional[Datetime] = Field(default=None, description="更新时间",
                                            sa_column_kwargs={"comment": "更新时间"}, )


class TenantModel(DbBaseModel):
    __abstract__ = True  # 告诉框架这是一个抽象类，不映射为表
    tenant_id: Optional[Bigint] = Field(default=None, description="租户ID", sa_type=BIGINT,
                                        sa_column_kwargs={"comment": "租户ID", "server_default": "0"})
